Allow memflags to be specified to alloc_xenheap_pages().
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 28 Jan 2009 16:58:41 +0000 (16:58 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 28 Jan 2009 16:58:41 +0000 (16:58 +0000)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
15 files changed:
xen/arch/ia64/xen/domain.c
xen/arch/ia64/xen/mm.c
xen/arch/ia64/xen/xenmem.c
xen/arch/x86/bzimage.c
xen/arch/x86/domain.c
xen/arch/x86/hvm/svm/vmcb.c
xen/arch/x86/smpboot.c
xen/common/page_alloc.c
xen/common/trace.c
xen/common/xenoprof.c
xen/common/xmalloc_tlsf.c
xen/drivers/char/console.c
xen/drivers/char/serial.c
xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
xen/include/xen/mm.h

index b9379a19a10219902568fb6a4fdb0702ef9cb6b2..52312fc969d782949a707dd7db292cf14eca7e69 100644 (file)
@@ -509,7 +509,7 @@ int vcpu_late_initialise(struct vcpu *v)
 
        /* Create privregs page. */
        order = get_order_from_shift(XMAPPEDREGS_SHIFT);
-       v->arch.privregs = alloc_xenheap_pages(order);
+       v->arch.privregs = alloc_xenheap_pages(order, 0);
        if (v->arch.privregs == NULL)
                return -ENOMEM;
        BUG_ON(v->arch.privregs == NULL);
@@ -578,7 +578,8 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags)
 #endif
        if (tlb_track_create(d) < 0)
                goto fail_nomem1;
-       d->shared_info = alloc_xenheap_pages(get_order_from_shift(XSI_SHIFT));
+       d->shared_info = alloc_xenheap_pages(
+               get_order_from_shift(XSI_SHIFT), 0);
        if (d->shared_info == NULL)
                goto fail_nomem;
        BUG_ON(d->shared_info == NULL);
index d4052b3bbb861f3597b5db5e392c6b4580232f45..b691db26b0f0e3f749e278e6cdcfe94e5124e746 100644 (file)
@@ -3076,7 +3076,7 @@ void *pgtable_quicklist_alloc(void)
         clear_page(p);
         return p;
     }
-    p = alloc_xenheap_pages(0);
+    p = alloc_xenheap_page();
     if (p) {
         clear_page(p);
         /*
index a7a6076073318f4eeabcc2ac271f2bf7c63166fa..5e170076ebd41183c21596f8dae49aec295f2729 100644 (file)
@@ -64,7 +64,7 @@ paging_init (void)
        mpt_table_size = max_page * sizeof(unsigned long);
        mpt_order = get_order(mpt_table_size);
        ASSERT(mpt_order <= MAX_ORDER);
-       if ((mpt_table = alloc_xenheap_pages(mpt_order)) == NULL)
+       if ((mpt_table = alloc_xenheap_pages(mpt_order, 0)) == NULL)
                panic("Not enough memory to bootstrap Xen.\n");
 
        printk("machine to physical table: 0x%lx mpt_table_size 0x%lx\n"
index f8a64e43602e0d421110929134884450c5c3a29e..e1b45a756157b19a72b05b0d1c473e8e7991b028 100644 (file)
@@ -110,7 +110,7 @@ static  __init int perform_gunzip(char *output, char **_image_start, unsigned lo
 
     window = (unsigned char *)output;
 
-    free_mem_ptr = (unsigned long)alloc_xenheap_pages(HEAPORDER);
+    free_mem_ptr = (unsigned long)alloc_xenheap_pages(HEAPORDER, 0);
     free_mem_end_ptr = free_mem_ptr + (PAGE_SIZE << HEAPORDER);
 
     inbuf = (unsigned char *)image;
index 7e3c82f614a8b8a0952cb9eec99c4bb2ad90e787..3f8f973b4c719a155a347c8ec7d817afbc34c3a9 100644 (file)
@@ -357,7 +357,7 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags)
     INIT_LIST_HEAD(&d->arch.relmem_list);
 
     pdpt_order = get_order_from_bytes(PDPT_L1_ENTRIES * sizeof(l1_pgentry_t));
-    d->arch.mm_perdomain_pt = alloc_xenheap_pages(pdpt_order);
+    d->arch.mm_perdomain_pt = alloc_xenheap_pages(pdpt_order, 0);
     if ( d->arch.mm_perdomain_pt == NULL )
         goto fail;
     memset(d->arch.mm_perdomain_pt, 0, PAGE_SIZE << pdpt_order);
@@ -405,17 +405,12 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags)
         if ( d->arch.ioport_caps == NULL )
             goto fail;
 
-#ifdef __i386__
-        if ( (d->shared_info = alloc_xenheap_page()) == NULL )
-            goto fail;
-#else
-        pg = alloc_domheap_page(
-            NULL, MEMF_node(domain_to_node(d)) | MEMF_bits(32));
-        if ( pg == NULL )
+        /*
+         * The shared_info machine address must fit in a 32-bit field within a
+         * 32-bit guest's start_info structure. Hence we specify MEMF_bits(32).
+         */
+        if ( (d->shared_info = alloc_xenheap_pages(0, MEMF_bits(32))) == NULL )
             goto fail;
-        pg->count_info |= PGC_xen_heap;
-        d->shared_info = page_to_virt(pg);
-#endif
 
         clear_page(d->shared_info);
         share_xen_page_with_guest(
index 73894f881c286eaaf497e430687a1649b7e4767d..080c05c762c1d8fdbe3cf606fc494d2ac289a4b6 100644 (file)
@@ -138,7 +138,7 @@ static int construct_vmcb(struct vcpu *v)
                             CR_INTERCEPT_CR8_WRITE);
 
     /* I/O and MSR permission bitmaps. */
-    arch_svm->msrpm = alloc_xenheap_pages(get_order_from_bytes(MSRPM_SIZE));
+    arch_svm->msrpm = alloc_xenheap_pages(get_order_from_bytes(MSRPM_SIZE), 0);
     if ( arch_svm->msrpm == NULL )
         return -ENOMEM;
     memset(arch_svm->msrpm, 0xff, MSRPM_SIZE);
index a77d406f46a8eb496f8caf280facb19b54c93d54..f30a32f0d41ff964b8c3a60b6dce0cfe955b8c89 100644 (file)
@@ -804,7 +804,7 @@ static inline int alloc_cpu_id(void)
 static void *prepare_idle_stack(unsigned int cpu)
 {
        if (!stack_base[cpu])
-               stack_base[cpu] = alloc_xenheap_pages(STACK_ORDER);
+               stack_base[cpu] = alloc_xenheap_pages(STACK_ORDER, 0);
 
        return stack_base[cpu];
 }
@@ -867,7 +867,7 @@ static int __devinit do_boot_cpu(int apicid, int cpu)
                                           MEMF_node(cpu_to_node(cpu)));
                per_cpu(gdt_table, cpu) = gdt = page_to_virt(page);
 #else
-               per_cpu(gdt_table, cpu) = gdt = alloc_xenheap_pages(order);
+               per_cpu(gdt_table, cpu) = gdt = alloc_xenheap_pages(order, 0);
 #endif
                memcpy(gdt, boot_cpu_gdt_table,
                       NR_RESERVED_GDT_PAGES * PAGE_SIZE);
index 648fbd6971df1725324ea5f315d83b2e94579396..a18811d70100ff34c2bb9da587b0e99d9b15e857 100644 (file)
@@ -655,7 +655,7 @@ void init_xenheap_pages(paddr_t ps, paddr_t pe)
 }
 
 
-void *alloc_xenheap_pages(unsigned int order)
+void *alloc_xenheap_pages(unsigned int order, unsigned int memflags)
 {
     struct page_info *pg;
 
@@ -664,15 +664,11 @@ void *alloc_xenheap_pages(unsigned int order)
     pg = alloc_heap_pages(
         MEMZONE_XEN, MEMZONE_XEN, cpu_to_node(smp_processor_id()), order);
     if ( unlikely(pg == NULL) )
-        goto no_memory;
+        return NULL;
 
     memguard_unguard_range(page_to_virt(pg), 1 << (order + PAGE_SHIFT));
 
     return page_to_virt(pg);
-
- no_memory:
-    printk("Cannot handle page request order %d!\n", order);
-    return NULL;
 }
 
 
@@ -695,26 +691,21 @@ void init_xenheap_pages(paddr_t ps, paddr_t pe)
     init_domheap_pages(ps, pe);
 }
 
-void *alloc_xenheap_pages(unsigned int order)
+void *alloc_xenheap_pages(unsigned int order, unsigned int memflags)
 {
     struct page_info *pg;
     unsigned int i;
 
     ASSERT(!in_irq());
 
-    pg = alloc_heap_pages(
-        MEMZONE_XEN+1, NR_ZONES-1, cpu_to_node(smp_processor_id()), order);
+    pg = alloc_domheap_pages(NULL, order, memflags);
     if ( unlikely(pg == NULL) )
-        goto no_memory;
+        return NULL;
 
     for ( i = 0; i < (1u << order); i++ )
         pg[i].count_info |= PGC_xen_heap;
 
     return page_to_virt(pg);
-
- no_memory:
-    printk("Cannot handle page request order %d!\n", order);
-    return NULL;
 }
 
 void free_xenheap_pages(void *v, unsigned int order)
index e41cfb90a6054da08aceb95ae692264c9937a89e..129af3c7da9a4fc3d3040ab33ebe8e7c01058fd4 100644 (file)
@@ -94,7 +94,7 @@ static int alloc_trace_bufs(void)
     order    = get_order_from_pages(nr_pages);
     data_size  = (opt_tbuf_size * PAGE_SIZE - sizeof(struct t_buf));
     
-    if ( (rawbuf = alloc_xenheap_pages(order)) == NULL )
+    if ( (rawbuf = alloc_xenheap_pages(order, 0)) == NULL )
     {
         printk("Xen trace buffers: memory allocation failed\n");
         opt_tbuf_size = 0;
index 4e71454a5a6a046687a73e2750d5782f5bd60632..f16ac800ef99906354ffa889157b7734b071d6fd 100644 (file)
@@ -225,7 +225,7 @@ static int alloc_xenoprof_struct(
     bufsize += (max_samples - 1) * i;
     npages = (nvcpu * bufsize - 1) / PAGE_SIZE + 1;
 
-    d->xenoprof->rawbuf = alloc_xenheap_pages(get_order_from_pages(npages));
+    d->xenoprof->rawbuf = alloc_xenheap_pages(get_order_from_pages(npages), 0);
     if ( d->xenoprof->rawbuf == NULL )
     {
         xfree(d->xenoprof);
index 032755b74c764266f604656b00639746a2cff747..7a476e8fb7facefb68225faa9e21968cdbb97804 100644 (file)
@@ -300,7 +300,7 @@ struct xmem_pool *xmem_pool_create(
     pool_bytes = ROUNDUP_SIZE(sizeof(*pool));
     pool_order = get_order_from_bytes(pool_bytes);
 
-    pool = (void *)alloc_xenheap_pages(pool_order);
+    pool = (void *)alloc_xenheap_pages(pool_order, 0);
     if ( pool == NULL )
         return NULL;
     memset(pool, 0, pool_bytes);
@@ -505,12 +505,12 @@ static struct xmem_pool *xenpool;
 static void *xmalloc_pool_get(unsigned long size)
 {
     ASSERT(size == PAGE_SIZE);
-    return alloc_xenheap_pages(0);
+    return alloc_xenheap_page();
 }
 
 static void xmalloc_pool_put(void *p)
 {
-    free_xenheap_pages(p,0);
+    free_xenheap_page(p);
 }
 
 static void *xmalloc_whole_pages(unsigned long size)
@@ -518,7 +518,7 @@ static void *xmalloc_whole_pages(unsigned long size)
     struct bhdr *b;
     unsigned int pageorder = get_order_from_bytes(size + BHDR_OVERHEAD);
 
-    b = alloc_xenheap_pages(pageorder);
+    b = alloc_xenheap_pages(pageorder, 0);
     if ( b == NULL )
         return NULL;
 
index 9d24390d38f8f28dbd870121c09ad5ea07c21b4f..3096b3ec9d27c3a6aca8da7a5a1f6b23070740c7 100644 (file)
@@ -885,7 +885,7 @@ static int __init debugtrace_init(void)
         return 0;
 
     order = get_order_from_bytes(bytes);
-    debugtrace_buf = alloc_xenheap_pages(order);
+    debugtrace_buf = alloc_xenheap_pages(order, 0);
     ASSERT(debugtrace_buf != NULL);
 
     memset(debugtrace_buf, '\0', bytes);
index 28cd434a5637f28b9ece554406a21f72fec9a486..cc8440fab21cf969b99a7b9fe8e00f53c3c17b99 100644 (file)
@@ -495,7 +495,7 @@ void serial_async_transmit(struct serial_port *port)
     BUG_ON(!port->driver->tx_empty);
     if ( port->txbuf == NULL )
         port->txbuf = alloc_xenheap_pages(
-            get_order_from_bytes(serial_txbufsz));
+            get_order_from_bytes(serial_txbufsz), 0);
 }
 
 /*
index 3560d00d0ed10e048394c6e67028dabae7a5eff1..1722c340da19fa05c60d6cc03deb278792f94947 100644 (file)
@@ -140,7 +140,7 @@ static inline void free_amd_iommu_pgtable(struct page_info *pg)
 static inline void* __alloc_amd_iommu_tables(int order)
 {
     void *buf;
-    buf = alloc_xenheap_pages(order);
+    buf = alloc_xenheap_pages(order, 0);
     return buf;
 }
 
index a982609f55e1f062c2b932e4d8be40c489d91b71..0f0726b1f8a5a1a6fc8533fc5b194312bcc388d5 100644 (file)
@@ -45,9 +45,9 @@ void end_boot_allocator(void);
 
 /* Xen suballocator. These functions are interrupt-safe. */
 void init_xenheap_pages(paddr_t ps, paddr_t pe);
-void *alloc_xenheap_pages(unsigned int order);
+void *alloc_xenheap_pages(unsigned int order, unsigned int memflags);
 void free_xenheap_pages(void *v, unsigned int order);
-#define alloc_xenheap_page() (alloc_xenheap_pages(0))
+#define alloc_xenheap_page() (alloc_xenheap_pages(0,0))
 #define free_xenheap_page(v) (free_xenheap_pages(v,0))
 
 /* Domain suballocator. These functions are *not* interrupt-safe.*/